home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat60 / dsic / dsic.english.doc next >
Text File  |  1994-04-05  |  27KB  |  762 lines

  1.                         ----------------
  2.                         ---   DSIC   ---
  3.                         ----------------
  4.             ----------------------------------------
  5.             -         Rodrigo REYES 1993           -
  6.             ----------------------------------------
  7.  
  8.        [A Dynamic String Implementation for the C language]
  9.  
  10.  
  11.  
  12. 0. Introduction.
  13. ----------------
  14.  
  15.  
  16.   This module, basically written for the C language, was made with the
  17. goal of eliminating a lack of C : The Dynamic Implementation of strings. 
  18.  
  19.   Usually, with C, if you want to use strings, you need to do yourself
  20. your own memory allocation, loading, deleting, and re-allocation etc...
  21.   In this way, we only can appreciate the strings facilities given by
  22. the basic language with which the programmer do nothing, because all the
  23. code is already made.
  24.  
  25.   DSIC was made because of this lack.
  26.  
  27.   Its only limitation is that the programmer has to define the length of
  28. the buffer where the strings are to be put in, with no need for him to
  29. know anything about this. But this is a High-Level language way of
  30. programming.
  31.   This limitation can anyway be in fact a good thing, as it forces the
  32. programmer to know exactly the needs of its program.
  33.  
  34.   DSIC is written in assembly language. I perfectly know that C compilers
  35. uses to be top-optimizing, but I really prefer assemblor for having a full
  36. control of my code. At most, it gives a very compact file : less than
  37. 3 kb, and nearly as many functions as the GFA-Basic !!! 
  38.  
  39.  
  40.  
  41.  
  42. 1. DSIC : Inside. First approach.
  43. ---------------------------------
  44.  
  45.   Here is a little sommary of the public functions of DSIC, usable
  46. through the C language.
  47.  
  48.  
  49.  Buffer = StringBufferInit( Buffer )
  50.           StringBufferEnd()
  51.  
  52.  NewStr = NewString( String )
  53.  NewStr = StringClone( String )
  54.  
  55.           StringDelete( String )
  56.  
  57.  NewStr = StringAdd( String1,String2 )
  58.  NewStr = StringUnion ( String1,String2 )
  59.  
  60.  NewStr = StringSpace ( Number )
  61.  
  62.  StrPtr = StringTrunc ( String )
  63.  
  64.  Length = StringLength ( String )
  65.  Length = StringLen ( String )    (synonym of StringLength )
  66.  
  67.  Result = StringComp ( String1,String2 )
  68.  Result = StringCompNC ( String1,String2 )
  69.  
  70.  Offset = StringIndex ( MasterString,SlaveString )
  71.  Offset = StringIndexNC ( MasterString,SlaveString )
  72.  
  73.  StrPtr = StringUP ( String )
  74.  StrPtr = StringDown ( String )
  75.  
  76.  NewStr = StringExtract ( String,Offset,Length )
  77.  NewStr = StringLeft ( String, Length )
  78.  NewStr = StringRight ( String, Length )
  79.  
  80.  NewStr = StringDec ( Number )
  81.  NewStr = StringHex ( Number )
  82.  
  83.  Number = StringVal ( String )
  84.  
  85. Error = LastStringError.
  86.  
  87.  
  88. (nb: NewStr as result signifies that a new string is created, and NewPtr
  89. is a pointer on that string. StrPtr signifies that the returned pointer was
  90. ever known from the programmer).
  91.  
  92.  
  93.  
  94.  
  95. 2. How to call it.
  96. ------------------
  97.  
  98.         2.1 Using DICE.
  99.         ---------------
  100.  
  101. ie. I have such a program :
  102.  
  103. void main()
  104. {       char *StringPtr;
  105.  
  106.         StringBufferInit(10000);   /* allocate a 10'000 bytes long buffer */
  107.         
  108.         StringPtr = NewString("    Kaka Poom Poom !   ");
  109.  
  110.         StringPtr = StringTrunc(StringUp(StringPtr));
  111.                          /* remove spaces & turns into upper case  */   
  112.  
  113.         StringPtr = StringUnion(StringPtr," Ploc Ploc ?");
  114.  
  115.         StringBufferEnd();      /* Clean da buffer before leaving */
  116.  
  117.         return(0);
  118. }
  119.  
  120.   To compile this proggy using DICE :
  121.  
  122.        _______________________________________________
  123.       | CLI                                     |  |  |
  124.       ------------------------------------------------          
  125.       | 1> DCC ProgTest.c -oProgTest -lDLIB:DSIC.o    |
  126.       |                                               |
  127.       -------------------------------------------------
  128.  
  129. (this need the DSIC.o file to be in the DLIB: drawer, and the program
  130. saved as ProgTest.c)
  131.  
  132.   That's all. Of course you can put this line at the top of your
  133. text : 
  134.  
  135. #include "DSIC.h"
  136.  
  137.   DSIC.h contains all the prototypes that your compiler may need.
  138.  
  139.  
  140.         2.2 Using SAS-C.
  141.         ----------------
  142.  
  143.   Even easier, just run SASCOPT, and specify to the LINKER options you
  144. want the file DSIC.o to be linked with your prog. And don't forget to 
  145. add at the top of your text file the include #include "DSIC.h" (and
  146. so the DSIC.h file has to be in your include: folder).
  147.  
  148.         2.3 Using another compiler.
  149.         ---------------------------
  150.  
  151.   I don't know, maybe is it the same.
  152.   As long as the parameters fly thru the stack, that's OK.
  153.  
  154.  
  155.  
  156.  
  157.  
  158. 3. The functions.
  159. -----------------
  160.  
  161.  
  162. _______________________________________
  163.  
  164. Function :      Buffer = StringBufferInit( Length )
  165.  
  166. Parameters:
  167.         INPUT:  Length : A long word containing the length of the wished
  168.                         buffer. In fact, the length depend on what you
  169.                         want to do. If you know you will have a lot of
  170.                         strings, you ought to put a biggy number. 
  171.  
  172.         RESULT: Buffer : Gets the address of the buffer, but it is useless
  173.                         as DSIC does all the work for you. I let it cause
  174.                         it may be of some use and it takes just 4 bytes of
  175.                         code.
  176.                         BEWARE: Always give 0 (NULL) if the buffer hadn't
  177.                         been allocated (in such a case, if you use them,
  178.                         the functions shouldn't crash, but just do nothing).
  179.  
  180.         EXPLAINATION:   This function allocate a buffer where all the
  181.                         strings are dynamically treated & re-placed.
  182.                         Absolutly NEEDED for any function that needs some
  183.                         place in the buffer (with a new string pointer as a
  184.                         result). Other functions don't need the buffer.
  185.  
  186.         EXEMPLE:        StringBufferInit( 20000 ); /* Allocate 20kb of
  187.                                                                   buffer*/
  188.  
  189.  
  190. _______________________________________
  191.  
  192. Function :      StringBufferEnd()
  193.  
  194. Parameters:
  195.         INPUT:  none
  196.  
  197.         RESULT: none
  198.  
  199.         EXPLAINATION:   Free the memory allocated via the StringBufferInit()
  200.                         function. Absolutly necessary in order to clean up
  201.                         the memory. If no buffer has been allocated, just
  202.                         do nothing (uncrashable!). 
  203.                         BEWARE :  Every StringBufferInit() function should
  204.                         have its StringBufferEnd().
  205.  
  206.         EXEMPLE:        void main()
  207.                         {       StringBufferInit( 200000);
  208.  
  209.                                 ...
  210.  
  211.                                 StringBufferEnd();
  212.                         }                               /* GOOD */
  213.  
  214.                         But : 
  215.                         main()
  216.                         {       StringBufferInit( 10000);
  217.                                 ...                     
  218.                                 StringBufferEnd();
  219.                                 ...
  220.                                 StringBufferInit( 5000);
  221.                                 ...
  222.                                 StringBufferEnd();
  223.                         }                               /* IS GOOD */
  224.  
  225.                         and :
  226.                         main()
  227.                         {
  228.                                 StringBufferInit( 10000);
  229.                                 ...
  230.                                 StringBufferInit( 5000);
  231.                                 ...
  232.                                 StringBufferEnd();
  233.                                 StringBufferEnd();
  234.                         }                               /* WRONG !!!! */
  235.                              /* There can be only ONE buffer at
  236.                                 the same time !!! */
  237.                                 
  238.  
  239. _______________________________________
  240.  
  241. Function :      NewStr = NewString( String )
  242.  
  243. Parameters:
  244.         INPUT:  String: A pointer on any string. Must be NULL-TERMINATED!
  245.                         (All strings given by DSIC *ARE* null-terminated).
  246.  
  247.         RESULT: NewStr: A pointer on a new address for this string in the
  248.                         buffer.
  249.  
  250.         EXPLAINATION:   This function copies a given string in the buffer.
  251.                         The string given is not erased. Do the same than
  252.                         StringClone().
  253.  
  254.         EXEMPLE:        char *mystring;
  255.                         mystring = NewString("This is a string!");
  256.                         mystring = Newstring("and another string");
  257.  
  258.  
  259. _______________________________________
  260.  
  261. Function :      NewStr = StringAdd(String1,String2);
  262.  
  263. Parameters:
  264.         INPUT:  String1: A pointer on a string.
  265.                 String2: A pointer on another string.
  266.  
  267.         RESULT: NewStr : A new pointer on a new string.
  268.  
  269.         EXPLAINATION: Creates a new string containing String1 + String2.
  270.                       String1 and String2 are not changed at all.
  271.  
  272.         EXEMPLE:        char *string;
  273.                         string = StringAdd("Janet is a slut ",
  274.                                                 "and Brad is an asshole");
  275.                         
  276.                 /* *string points on 'Janet is a slut and Brad is an asshole'
  277.                         the two given strings are not changed            */
  278.  
  279.  
  280. _______________________________________
  281.  
  282. Function :      StrPtr = StringUnion( String1, String2)
  283.  
  284. Parameters:
  285.         INPUT:  String1 = A pointer on a string.
  286.                 String2 = A pointer on a string.
  287.  
  288.         RESULT: StrPtr = Pointer on the new address of String1.
  289.  
  290.         EXPLAINATION: Mostly the same than StringAdd(), but instead of
  291.                       just creating a new string object, this function
  292.                       delete the String1 in order to relocate it.
  293.                 BEWARE : The old address pointed by String1 is not valid
  294.                          anymore as it has been totally erased. So you
  295.                          should absolutly get the new address given by this
  296.                          function for String1. No changes are made on String2.
  297.  
  298.         EXEMPLE:        char *string1,*string2;
  299.                         string1 = StringUnion("hello ","world !");
  300.                         string1 = StringUnion(string1," wonderful world!");
  301.                 /* and you get 'hello world! wonderful world!' in String1 */
  302.  
  303.  
  304. _______________________________________
  305.  
  306. Function :      NewStr = StringClone( String )
  307.  
  308. Parameters:
  309.         INPUT:  String = A string pointer.
  310.  
  311.         RESULT: NewStr = Another string pointer.
  312.  
  313.         EXPLAINATION:   Copy the string String in the buffer and returns
  314.                         its pointer. I am still wondering why I have done
  315.                         this function as it does exactly the same than
  316.                         NewString(). Sure there is a reason... Gonna think
  317.                         about it...
  318.  
  319.         EXEMPLE:        char *str;
  320.                 str = StringClone("Why have i done this function ?");
  321.  
  322.  
  323.  
  324. _______________________________________
  325.  
  326. Function :      NewStr = StringSpace( Number )
  327.  
  328. Parameters:
  329.         INPUT:  Number = A long word with a number.
  330.  
  331.         RESULT: NewStr = A new string pointer.
  332.  
  333.         EXPLAINATION: Creates a new string pointer on a string containing
  334.                       <Number> white spaces.
  335.  
  336.         EXEMPLE:        char *spacestring;
  337.                         spacestring = StringSpace(25);
  338.                 /* create a string with 25 white spaces  */
  339.  
  340.  
  341. _______________________________________
  342.  
  343. Function :      StrPtr = StringTrunc( String )
  344.  
  345. Parameters:
  346.         INPUT:  String = A string pointer.
  347.  
  348.         RESULT: StrPtr = The new pointer for the given string.
  349.  
  350.         EXPLAINATION: Eliminates white spaces at the beginning and at the
  351.                       end of the string.
  352.                 BEWARE : As some spaces might be eliminated at the beginning
  353.                          of the string, you should get the new address of the
  354.                          string, returned by this function.
  355.                          As the string may be relocated, and so erased, the
  356.                          string String should be in the buffer (You can use
  357.                          either NewString() or StringClone() ).
  358.  
  359.         EXEMPLE:        char *mystring;
  360.                 mystring = NewString("  Gonna dance   ");
  361.                 mystring = StringTrunc(mystring);
  362.  
  363.  
  364. _______________________________________
  365.  
  366. Function :      Length = StringLength( String )
  367.                 synonym : Length = StringLen( String )
  368. Parameters:
  369.         INPUT:  String: A string pointer.
  370.  
  371.         RESULT: Length: A long word containing the length of the string,in
  372.                 bytes.
  373.  
  374.         EXPLAINATION: Give the length of a given string.
  375.  
  376.         EXEMPLE:        char *str;
  377.                         int size;
  378.                         str = StringTrunc( NewString(" HeLlO WoRlD \n  "));
  379.                         size = StringLen(str);
  380.  
  381. _______________________________________
  382.  
  383. Function : void StringDelete( String )
  384.  
  385. Parameters:
  386.         INPUT:  String: Any string pointer.
  387.  
  388.         RESULT: None.
  389.  
  390.         EXPLAINATION:   Erase every byte of a string. To do it, this
  391.                         function reset to 0 every byte. The buffer area
  392.                         freed is now available for any other string.
  393.  
  394.         EXEMPLE:        char *string;
  395.                         string = NewString(" Mamma mia!");
  396.                         StringDelete(string);   /* erase it  */
  397.  
  398. _______________________________________
  399.  
  400. Function :      Result = StringComp( String1, String 2)
  401.  
  402. Parameters:
  403.         INPUT:  String1: a string pointer.
  404.                 String2: another string pointer.
  405.  
  406.         RESULT: Result: the result of the comparison.
  407.  
  408.         EXPLAINATION:   Compare the two given strings and give -1 (true) if
  409.                         they are strictly identical, et 0 (false) if not.
  410.                         This function handles upper/lower case difference.
  411.  
  412.         EXEMPLE:        char *string1;
  413.                         int result;
  414.                         string1= NewString("A cat");
  415.                         result = StringComp(string1,"A dog ?");
  416.                         result = StringComp("elephant","mouse");
  417.  
  418. _______________________________________
  419.  
  420. Function :      Result = StringCompNC( String1, String2)
  421.  
  422. Parameters:
  423.         INPUT:  String1: a string pointer.
  424.                 String2: yet another string pointer.
  425.  
  426.         RESULT: Result: a long word.
  427.  
  428.         EXPLAINATION: The same than StringComp(), it compares two string,
  429.                       but doesn't handle lower/upper case differences.
  430.                       Give -1 if true (same), et 0 if false (not the same).
  431.  
  432.         EXEMPLE:        int result;
  433.                         result = StringCompNC("a cat","A CAT");
  434.                                         /*  returns -1   */
  435.  
  436. _______________________________________
  437.  
  438. Function :      Offset = StringIndex( BigString, LittleString)
  439.  
  440. Parameters:
  441.         INPUT:  BigString:  a string pointer.
  442.                 LittleString: a pointer on the searched string.
  443.  
  444.         RESULT: Offset: A long word containing the offset of the LittleString
  445.                 in the BigString.
  446.  
  447.         EXPLAINATION: Returns the offset (the index) of the sub-string
  448.                       LittleString in the main string BigString.
  449.                       If LittleString can't be found in BigString, this
  450.                       function returns -1.
  451.                       This function handle the upper/lower case differences.
  452.  
  453.         EXEMPLE:        int offset;
  454.                         offset = StringIndex("sex, Sex, Always SEX","Sex");
  455.                                 /*   returns   5  */
  456.  
  457. _______________________________________
  458.  
  459. Function :      Offset = StringIndexNC( BigString, LittleString)
  460.  
  461. Parameters:
  462.         INPUT:  BigString: A string pointer.
  463.                 LittleString: another string pointer.
  464.  
  465.         RESULT: Offset: Index of the first occurence of LittleString.
  466.  
  467.         EXPLAINATION: Just like StringIndex(), give the offset of the
  468.                       first occurence of LittleString in BigString, but
  469.                       makes no difference between upper and lower case.
  470.                       Returns -1 if there is no occurence of LittleString
  471.                       in BigString.
  472.  
  473.         EXEMPLE:        int offset;
  474.                         offset = StringIndex("piPiRiPaO","PAO");
  475.                                   /*   returns 6    */
  476.  
  477.  
  478. _______________________________________
  479.  
  480. Function :      StrPtr = StringUp( String )
  481.             or 
  482.                 StringUp(String)
  483.  
  484. Parameters:
  485.         INPUT:  String: A string pointer.
  486.  
  487.         RESULT: StrPtr: Returns the pointer as input. (StrPtr = String).
  488.         
  489.         EXPLAINATION: Turns all the lower case letters of String in
  490.                       upper case.
  491.                       Some people may ask why is StrPtr returning exactly
  492.                       the same value than String because if we give it,
  493.                       it is because we know it (of course !). In fact,
  494.                       it allows some strange things like :
  495.  
  496.                string = StringUnion( StringUp( NewString("hello"))," world");
  497.  
  498.                       This exemple creates a string in the dsic buffer, then
  499.                       turns this one in upper case, and then adds another
  500.                       string to it.
  501.                       The same pointer flies thru every function, and finally
  502.                       arrives safely in 'string'.
  503.  
  504.         EXEMPLE:        StringUp(mystring);
  505.                         astring = StringUp(NewString("a-ha!!!"));
  506.                               /*   turns "a-ha!!!" to "A-HA!!!"   */
  507.  
  508. _______________________________________
  509.  
  510. Function :      StrPtr = StringDown( String )
  511.              or
  512.                 StringDown( String )
  513.  
  514. Parameters:
  515.         INPUT:  String: A string pointer.
  516.  
  517.         RESULT: StrPtr: the string pointer on the converted string.
  518.  
  519.         EXPLAINATION:  Turns every letters of the string String in lower
  520.                        case. The contrary of StringUp(). It works the
  521.                        same way.
  522.  
  523.         EXEMPLE:        char *string;
  524.                         string = StringDown( StringAdd("54321"," zero!"));
  525.  
  526. _______________________________________
  527.  
  528. Function :      NewStr = StringExtract( String, Offset, Length)
  529.  
  530. Parameters:
  531.         INPUT: String: a pointer on a string.
  532.                Offset: a long word that indicates the offset.
  533.                Length: a long word that indicates the length to extract.
  534.  
  535.         RESULT: NewStr: a new pointer on the new created string.
  536.  
  537.         EXPLAINATION: Creates a new string in the dsic buffer, containing
  538.                       <Length> characters taken from the <Offset> character
  539.                       of the string <String>. Equivalent of the instruction
  540.                       MID$ of basic language.
  541.  
  542.                       NOTE: The first character of the string has offset
  543.                       0, the second has offset 1, the third 2, etc...
  544.  
  545.         EXEMPLE:        char *string;
  546.                         string = StringExtract("I love pizza",7,4);
  547.                             /*   makes a new string containing "pizz" */
  548.  
  549. _______________________________________
  550.  
  551. Function :      NewStr = StringLeft( String, Length)
  552.  
  553. Parameters:
  554.         INPUT:  String: a string pointer.
  555.                 Length: a long word containing the length to extract.
  556.  
  557.         RESULT: NewStr: a new pointer on a new string.
  558.  
  559.         EXPLAINATION: Extract <Length> characters from the left of the
  560.                       string <String> (from the beginning of the string),
  561.                       and creates a new string in the dsic buffer.
  562.  
  563.         EXEMPLE:        char *string;
  564.                         string = StringLeft("Dear mr president...",4);
  565.                 /* returns a pointer on a string containing 'dear' */
  566.  
  567.  
  568. _______________________________________
  569.  
  570. Function :      NewStr = StringRight( String, Length )
  571.  
  572. Parameters:
  573.         INPUT:  String: a string pointer.
  574.                 Length: Long word.
  575.  
  576.         RESULT: NewStr: a new string pointer in dsic buffer.
  577.  
  578.         EXPLAINATION:   Makes a new string containing <Length> characters
  579.                         of the string <String> from the right (end of the
  580.                         string). A new string is created, and its pointer
  581.                         is returned in <NewStr>.
  582.  
  583.         EXEMPLE:        char *string;
  584.                         string = StringRight("May the force be with U",5);
  585.                                 /* string points on 'ith U'  */
  586.  
  587.  
  588. _______________________________________
  589.  
  590. Function :      NewStr = StringDec( Number )
  591.  
  592. Parameters:
  593.         INPUT:  Number: any long word value.
  594.  
  595.         RESULT: NewStr: a pointeur on the ascii value.
  596.  
  597.         EXPLAINATION:   Turns a raw value into an ascii string. A new
  598.                         string is created in the buffer.
  599.  
  600.         EXEMPLE:        int *chain;
  601.                         chain = StringDec(999);
  602.                              /* chain points on '999'  */
  603.  
  604.  
  605. _______________________________________
  606.  
  607. Function :      NewStr = StringHex( Number )
  608.  
  609. Parameters:
  610.         INPUT:  Number: any long word number.
  611.  
  612.         RESULT: NewStr: a new string pointer.
  613.  
  614.         EXPLAINATION:   Just like StringDec(), turns a raw number into
  615.                         ascii displayable format, mais this one turns the
  616.                         number into an hexadecimal ascii display. No prefix
  617.                         if added (no '$' nor '0x'), if you want one, add it
  618.                         yourself. NewStr returns a new pointer on the new
  619.                         string.
  620.  
  621.         EXEMPLE:        char *chain;
  622.                         chain = StringHex( 4556 ); /* chain contains '11cc' */
  623.                         chain = StringHex( 0x123);/* chain contains '123'  */
  624.  
  625. _______________________________________
  626.  
  627. Function :      Number = StringVal( String )
  628.  
  629. Parameters:
  630.         INPUT:  String: A string pointer.
  631.  
  632.         RESULT: Number: a unsigned long word.
  633.  
  634.         EXPLAINATION: Quite identical to the VAL instruction of the basic
  635.                       language, this function returns the raw integer value
  636.                       contained as an ascii format in the string <String>.
  637.                       The value can be given in decimal format (most
  638.                       common case) or hexadecimal format (with '$' at the
  639.                       begining of the ascii string).
  640.                       BEWARE: StringVal() ignores the first spaces (char 32)
  641.                       at the begining of the ascii string, but stop scanning
  642.                       if any illegal character is encountered (non-numeric
  643.                       for decimal format, non-numeric and not a,b,c,d,e, or
  644.                       f for hexadecimal format).
  645.                       Returns -1 is no value could be found.
  646.                       In hexadecimal format, letters can be either lower or
  647.                       upper case.
  648.                       In hexa and in decimal, only the 8 first ascii values
  649.                       are handled.
  650.  
  651.                       Actually, does not handle negative values.
  652.  
  653.         EXEMPLE:        int nb;
  654.                         nb = StringVal("    $1f03aj ");  /*  nb= 0x1f03a */
  655.                         nb = StringVal(" 1345d45z ");  /* nb = 1345  */
  656.                         nb = StringVal(" 1234567890"); /* nb = 12345678  */
  657.                         nb = StringVal(" Now is the number 10"); /* nb = -1 */
  658.  
  659.  
  660. _______________________________________
  661.  
  662. Function :      Error = LastStringError()
  663.  
  664. Parameters:
  665.         INPUT:  none.
  666.  
  667.         RESULT: Error: the error number.
  668.  
  669.         EXPLAINATION:  Returns the last error number encountered by
  670.                        DSIC:
  671.                              0 : currently no error.
  672.                              1 : Buffer is not allocated.
  673.                              2 : Buffer Overflow.
  674.  
  675.         EXEMPLE:        int ERR;
  676.                         ERR = LastStringError();
  677.  
  678. _______________________________________
  679.  
  680.  
  681.  
  682. 4. Some last few things.
  683. ------------------------
  684.  
  685.   It may be a good thing to call with no stinginess the function
  686. StringDelete(), which allows the buffer to be erased from times to 
  687. times.
  688.   NEVER forget to use StringBufferEnd() at the end of your code. This
  689. function is really easy to use, so you have no reason to let your
  690. computer crash because of an error in the memory list.
  691.   Be kind with your amiga, she is not a bad girl.
  692.  
  693.   VERY IMPORTANT : In any case, if a new pointer is returned by a function,
  694.                    a '0' (NULL) value means the relocation function failed.
  695.                    It DOES arrive when the buffer is overflow, or even more
  696.                    often when the buffer was not allocated first by
  697.                    StringBufferInit() (if the function was not called, or if
  698.                    the function failed).
  699.                    This note does not concern the functions that don't need
  700.                    any new string relocation ( StringUp(), StringDown(),
  701.                    StringIndex(), StringVal(), ... etc...).
  702.  
  703.  
  704. 5. SoftWare.
  705. ------------
  706.  
  707.   This module is FREEWARE. It can be used and added to any Public Domain
  708. program, without the author's permission. The assembly source file is
  709. also public domain. You can change it, modify anything wrong, do want you
  710. want with it.
  711.   My only request is that if you write something funny, usely, fantastic,
  712. or even just working, please send me a copy of your program. This is a
  713. request, not an obligation. This request is also valid if you modify the
  714. source code.
  715.   This module is freeware. It means that you can spread it as long as
  716. the package contains the files:
  717.         - DSIC.english.doc : The document you are reading.
  718.         - DSIC.francais.doc: The same document in french, my native
  719.                              language.
  720.         - DSIC.h           : The protos file containing the DSIC functions
  721.                              protos.
  722.         - DSIC.asm         : The assembly source file for this module.
  723.         - DSIC.o           : The module file that has to be linked with
  724.                              your program.
  725.  
  726.   Of course, the author takes no responsability for any machine crash,
  727. lost of data, or anything wrong with this module. 
  728.  
  729.  
  730.  
  731.  
  732.                 Rodrigo REYES __ 10/1993.
  733.  
  734.  
  735.  
  736.         You can contact me for any comment, question, answer, or
  737. anything else :
  738.  
  739.         Rodrigo REYES
  740.         20 Residence de la grande Prairie
  741.         91330 Yerres
  742.         France.
  743.  
  744. or via electronic mail at:
  745.  
  746.         SparkNet  74:320/100.7
  747.         FidoNet    2:320/214.7
  748.  
  749.         internet e-mail : available soon.
  750.  
  751. or even at :
  752.  
  753.         Electron BBS
  754.         node #1:  (+33)-1-69394630
  755.         node #2:  (+33)-1-69393152
  756.         wich are both in France, Paris, Brunoy.
  757.         and just mail me as 'Rodrigo Reyes'.
  758.  
  759.  
  760. OK?
  761.  
  762.